/****************************************************
 * 创建人: @author zoujian    
 * 创建时间: 2021-5-18/11:34
 * 项目名称: design_pattern
 * 文件名称: MyProxyUtils.java
 * 文件描述: @Description: jdk方式生成代理对象
 *
 * All rights Reserved, Designed By 投资交易团队
 * @Copyright:2016-2021
 *
 ********************************************************/
package com.zj.designpattern.proxy;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 包名称：com.zj.designpattern.proxy
 * 类名称：MyProxyUtils
 * 类描述：jdk方式proxy类生成代理对象
 * 创建人：@author zoujian
 * 创建时间：2021-5-18/11:34
 */
@Slf4j
public class MyProxyUtils {
    public static UserService getProxy(final UserService service){
        UserService proxy = (UserService) Proxy.newProxyInstance(
                service.getClass().getClassLoader(),
                service.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if("saveUser".equals(method.getName())){
                            log.info("开始执行新增用户操作");
                        }
                        return method.invoke(service, args);
                    }
                }
        );
        return proxy;
    }

    public static UserService getProxy(){
        //创建CGLIB核心类
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(new UserServiceImpl(23423,"432423").getClass());
        //设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                if("saveUser".equals(method.getName())){
                    log.info("cglib开始执行新增用户操作");
                }
                return methodProxy.invokeSuper(o, args);
            }
        });
        // 生成代理对象
        UserService proxy = (UserService) enhancer.create();
        return proxy;
    }


}
